import router from '@/router'
import store from '@/store'

// 设置路由导航守卫
// 设置路由导航守卫
router.beforeEach(async(to, from, next) => {
  if (store.getters.token) {
    // 已登录
    if (to.path === '/login') {
      // 还是去登录页, 就强制跳到首页
      next('/')
    } else {
      // 调用user模块中获取用户数据异步函数，因为后台多个页面需要用到用户数据
      // 为了方便使用和更好的优化代码和性能，所以加在了导航路由守卫中，每次路由时进行调用，所有页面都能获取用户数据
      // 同时需要进行判断，用户数据是否已经存在，存在就不需要再发送请求，避免路由时多次发送请求，增加服务器负担
      if (!store.state.user.userInfo.userId) {
        // 调用user模块中的获取用户数据异步函数
        await store.dispatch('user/getUserInfo')
        // 如果要进行权限的筛选, 在这就对了
        const menus = store.state.user.userInfo.roles.menus
        // 在登录之前根据用户的权限与路由名称匹配，调用permission模块中的actions筛选方法，0实现登录后显示对应的页面功能
        // 这里需要将筛选后的路由使用router.addRoutes()添加路由的方法，将用户能访问的路由页面添加到路由中
        const routers = await store.dispatch('permission/filterAsyncRoutes', menus)
        // 追加到路由配置当中
        router.addRoutes([...routers, { path: '*', redirect: '/404', hidden: true }])
        // 这时候添加完有权限的动态路由, 这是跳页面应该是可以的
        // 问题就是怎么跳页面
        // 再让路由守卫重新加载一次
        next(to.path)
        return
      }
      // 其他情况 放行
      next()
    }
  } else {
    // 未登录 白名单进行区分
    const whiteList = ['/login', '/404']
    if (whiteList.includes(to.path)) {
      // 存在于白名单中放行
      next()
    } else {
      // 否则跳去登录页
      next('/login')
    }
  }
})
